
#include "SmileController.h"
#include <math.h>

#ifndef _SMILECONTROLLER_CPP_
#define _SMILECONTROLLER_CPP_

SmileController::SmileController(){
	int modo, quantidade, i, deltat;
	Arq_smile aux, *arqtemp;
	Reg_smile *regtemp;
	regini = NULL;
	tBefore = SDL_GetTicks();
	tNow = 0;
	
	/* Leitura do Arquivo */
	arq = fopen("stage.smile", "r");
	while( fscanf ( arq, "%i", &modo) != EOF){
		if( regini == NULL) {
			regini = new SmileController::Reg_smile;
			regini->prox = NULL;
			regini->ante = NULL;
			regini->arq_smile = NULL;
			regtemp = regini;
		}
		else{
			regtemp->prox = new SmileController::Reg_smile;
			regtemp->prox->ante = regtemp;
			regtemp = regtemp->prox;
			regtemp->prox = NULL;
			regtemp->arq_smile = NULL;
		}
		if( modo == 0){
			aux.velocidade = 0;
			aux.Vdirecao = 0;
			aux.aceleracao = 0;
			aux.Adirecao = 0;
			fscanf(arq, "%i %f %i %i %i", &quantidade, &(aux.tamanho), &(aux.tvivo), &(aux.tmorto), &deltat);
			for( i = 0; i <quantidade; i ++){
				fscanf(arq, "%f %f", &(aux.x0), &(aux.y0));
				aux.smile = NULL;
				if( regtemp->arq_smile == NULL) {
					regtemp->arq_smile = new SmileController::Arq_smile;
					regtemp->arq_smile->ante = NULL;
					regtemp->arq_smile->prox = NULL;
					arqtemp = regtemp->arq_smile;
				}
				else{
					arqtemp->prox = new SmileController::Arq_smile;
					arqtemp->prox->ante = arqtemp;
					arqtemp = arqtemp->prox;
					arqtemp->prox = NULL;
				}
				arqtemp->velocidade = aux.velocidade;
				arqtemp->Vdirecao = aux.Vdirecao;
				arqtemp->aceleracao = aux.aceleracao;
				arqtemp->Adirecao = aux.Adirecao;
				arqtemp->tamanho = aux.tamanho;
				arqtemp->tvivo = aux.tvivo;
				arqtemp->tmorto = aux.tmorto;
				arqtemp->x0 = aux.x0;
				arqtemp->y0 = aux.y0;
				arqtemp->smile = NULL;
				arqtemp->tvivo += deltat * i; 
				arqtemp->tmorto += deltat * i;
			}
			fscanf(arq, "\n");
		}
		else if( modo == 1){
			aux.aceleracao = 0;
			aux.Adirecao = 0;
			fscanf(arq, "%i %f %f %f %i %i %i %f %f\n", &quantidade, &aux.x0, &aux.y0, &aux.tamanho, &aux.tvivo, &aux.tmorto, &deltat, &aux.velocidade, &aux.Vdirecao);
			for( i = 0; i <quantidade; i ++){
				aux.smile = NULL;
				if( regtemp->arq_smile == NULL) {
					regtemp->arq_smile = new SmileController::Arq_smile;
					regtemp->arq_smile->ante = NULL;
					regtemp->arq_smile->prox = NULL;
					arqtemp = regtemp->arq_smile;
				}
				else{
					arqtemp->prox = new SmileController::Arq_smile;
					arqtemp->prox->ante = arqtemp;
					arqtemp = arqtemp->prox;
					arqtemp->prox = NULL;
				}
				arqtemp->velocidade = aux.velocidade;
				arqtemp->Vdirecao = aux.Vdirecao;
				arqtemp->aceleracao = aux.aceleracao;
				arqtemp->Adirecao = aux.Adirecao;
				arqtemp->tamanho = aux.tamanho;
				arqtemp->tvivo = aux.tvivo;
				arqtemp->tmorto = aux.tmorto;
				arqtemp->x0 = aux.x0;
				arqtemp->y0 = aux.y0;
				arqtemp->smile = NULL;
				arqtemp->tvivo += deltat * i; 
				arqtemp->tmorto += deltat * i;
			}
		}
		else if( modo == 2){
			fscanf(arq, "%i %f %f %f %i %i %i %f %f %f %f\n", &quantidade, &aux.x0, &aux.y0, &aux.tamanho, &aux.tvivo, &aux.tmorto, &deltat, &aux.velocidade, &aux.Vdirecao, &aux.aceleracao, &aux.Adirecao);
			for( i = 0; i <quantidade; i ++){
				aux.smile = NULL;
				if( regtemp->arq_smile == NULL) {
					regtemp->arq_smile = new SmileController::Arq_smile;
					regtemp->arq_smile->ante = NULL;
					regtemp->arq_smile->prox = NULL;
					arqtemp = regtemp->arq_smile;
				}
				else{
					arqtemp->prox = new SmileController::Arq_smile;
					arqtemp->prox->ante = arqtemp;
					arqtemp = arqtemp->prox;
					arqtemp->prox = NULL;
				}
				arqtemp->velocidade = aux.velocidade;
				arqtemp->Vdirecao = aux.Vdirecao;
				arqtemp->aceleracao = aux.aceleracao;
				arqtemp->Adirecao = aux.Adirecao;
				arqtemp->tamanho = aux.tamanho;
				arqtemp->tvivo = aux.tvivo;
				arqtemp->tmorto = aux.tmorto;
				arqtemp->x0 = aux.x0;
				arqtemp->y0 = aux.y0;
				arqtemp->smile = NULL;
				arqtemp->tvivo += deltat * i; 
				arqtemp->tmorto += deltat * i;
			}
		}	
	}
}

void SmileController::run( SDL_MouseMotionEvent mouse){
	
	tNow += SDL_GetTicks() - tBefore;
	inclui();
	checa( mouse);
	organiza();
	//fprintf(stdout,"NOW: %d\n",tNow);
}

void SmileController::ler( ){
	int i=0, j;
	Arq_smile *arqaux;
	Reg_smile *regaux;
	regaux = regini;
	while ( regaux != NULL ){
		printf("REG %d \n", i);
		arqaux = regaux->arq_smile;
		j=0;
		while ( arqaux != NULL){
			printf("ARQ %d | Tvivo: %d X0: %f \n", j, arqaux->tvivo,  arqaux->x0);
			j++;
			arqaux = arqaux->prox;
		}
		i++;
		regaux = regaux->prox;
	}
	
}


void SmileController::inclui( ){
	Arq_smile *arqaux;
	Reg_smile *regaux;
	regaux = regini;
	while( regaux != NULL){
		arqaux = regaux->arq_smile;
		while( arqaux != NULL && arqaux->tvivo < tNow ){
			arqaux->smile = new Smile("../Images/drawing.png");
			arqaux->smile->update( arqaux->x0, arqaux->y0 );
			arqaux = arqaux->prox;
		}
		regaux = regaux->prox;
	}
}

void SmileController::checa ( SDL_MouseMotionEvent mouse){
	Reg_smile *regaux;
	Arq_smile *arqaux;
	SDL_Rect smileRect;
	regaux = regini;
	while( regaux != NULL){
		arqaux = regaux->arq_smile;
		while ( arqaux != NULL){
			if( arqaux->smile != NULL){
			    smileRect = arqaux->smile->Image->getRect();
				if( sqrt(pow(((smileRect.y + 25) - mouse.y), 2) + pow(((smileRect.x + 25) - mouse.x), 2)) < 35 ){
					arqaux->smile->destroy();
					arqaux->smile = NULL;
				}
				else if( tNow > arqaux->tmorto ){
					arqaux->smile->destroy();
					arqaux->smile = NULL;
				}
			}
			arqaux = arqaux->prox;
		}
		regaux = regaux->prox;
	}
}

void SmileController::organiza(){
	float X, Y, T;
	Reg_smile *regaux;
	Arq_smile *arqaux;
	regaux = regini;
	while( regaux != NULL){
		arqaux = regaux->arq_smile;
		while( arqaux != NULL && arqaux->tvivo  < tNow ){
			if( arqaux->smile == NULL ){
				printf(" DELETOU: %d %d \n", arqaux->tvivo, arqaux->tmorto);
				if( arqaux->ante != NULL) arqaux->ante->prox = arqaux->prox;
				else regaux->arq_smile = arqaux->prox;
				if( arqaux->prox != NULL) arqaux->prox->ante = arqaux->ante;
				else  {
					if( regaux->ante != NULL )regaux->ante->prox = regaux->prox;
					else regini = regaux->prox;
					if( regaux->prox != NULL )regaux->prox->ante = regaux->ante;
				}
				free( arqaux );
			}
			else{
				T = (tNow - arqaux->tvivo)/1000;
				X = arqaux->x0 + (arqaux->velocidade)*T*cos( arqaux->Vdirecao* 3.14 /180 ) + (arqaux->aceleracao)*T*T*cos( arqaux->Adirecao* 3.14 /180 )/2;
				Y = arqaux->y0 - (arqaux->velocidade)*T*sin( arqaux->Vdirecao* 3.14 /180 ) - (arqaux->aceleracao)*T*T*sin( arqaux->Adirecao* 3.14 /180 )/2;
				arqaux->smile->update ( X, Y );
			}
			arqaux = arqaux->prox;
		}
		regaux = regaux->prox;
	}
}

void SmileController::mostra(SDL_Surface *screen){
	Reg_smile *regaux;
	Arq_smile *arqaux;
	regaux = regini;
	while( regaux != NULL){
		arqaux = regaux->arq_smile;
		while ( arqaux != NULL && arqaux->smile != NULL ){
			arqaux->smile->draw(screen);
			arqaux = arqaux->prox;
		}
		regaux = regaux->prox;
	}
}
#endif
